# python 矩阵 数组 列表的一些只是总结：
from numpy import *
import numpy as np
# import pandas as pd

# # 1）创建矩阵
# a1 = np.array([[1,2,3],
#               [2,3,4]])
# print("矩阵a1：\n",a1)
# print("number of dimension:",a1.ndim)
# print("shape:",a1.shape)
# print('size:',a1.size)
#
# a2 = mat(a1)  # 二维数组，矩阵
# print("a2:",a2)
# print("a2矩阵的大小：",shape(a2))
# a3 = matrix([1,2,3])
# print("a3:",a3)
# print("a3矩阵的大小：",shape(a3))
#
# data1 = mat(zeros((3,3)))#创建一个3*3的零矩阵
# data2 = mat(ones( (2,4)) ) #创建一个 全1矩阵
# data3 = mat(random.rand(2,2)) #这里的random模块使用的是numpy中的random模块，random.rand(2,2)创建的是一个二维数组，需要将其转换成#matrix
# data4 = mat(random.randint(10,size=(3,3))) # 10以内的随机3*3 矩阵
# data5 = mat(random.randint(2,8,size=(2,6))) # 产生一个2-8之间随机整数的矩阵
# data6 = mat(eye(2,2,dtype=int)) #产生一个2*2 的对角矩阵
# print(data6)

# 对角矩阵
b = [1,2,3]
b1 = mat(diag(b)) # 生成一个对角线为1 2 3 的对角矩阵
print("对角矩阵为：\n",b1)

# 矩阵的运算
print("# 矩阵的运算：")
c1 = mat([1,2,3])
c2 = mat([[1],[2],[3]])
c3 = c1*c2
print("矩阵乘运算结果：",c3)

c4 = multiply(c1,c2)
print("矩阵对应元素相乘：\n",c4)
c5 = c1 * 2
print("矩阵扩大多少倍：",c5)

# 矩阵的逆 转置
print("# matrix 求逆：")
d1 =mat(eye(2,2)*0.5)
d2 = d1.I #求矩阵得逆矩阵
print("矩阵的逆矩阵为：\n",d2)
d3 = d1.T
print("矩阵的转置:\n",d3)
# 矩阵的每一列、行的和
d4 = mat([[1,1],[2,3],[4,2]])
d5 = d4.sum(axis=0)   #列求和
d6 = d4.sum(axis=1)  #行求和
print("列求和：\n",d5)
print("行求和：\n",d6)
d7 = sum(d4[1,:]) #计算第一行所有列之和
d8 = sum(d4[:,1])# 矩阵行数 0 1 2行  列数 0 1 列
print("注意d4矩阵：",d7) # 2+3=5
print("注意d4矩阵：",d8) # 1+3+2=6

# 计算最大值和最小值 和索引
d9 = d4.max()
print("d4 matrix max:",d9)
d10 = max(d4[:,1]) #计算第二列的最大值
print("第二列最大值：",d10)  #此方法得到的是矩阵
d11 = d4[1,:].max()
print("第二列最大值：",d11)  # this way calclulate a number
d12 = np.max(d4,0) #计算所有列的最大值
print("所有列的最大值:",d12)
d13 =np.max(d4,1) #计算所有行的最大值
print("所有行的最大值：\n",d13)
d14 = np.argmax(d4,0) #计算所有列的最大值对应的索引
print("所有列最大值对应的索引:\n",d14)
d15 = np.argmax(d4[1,:]) #
print("第二行最大值对应改行的索引:",d15)

e1 = mat([[1,2,3],[4,5,6],[7,8,9]])
e2 = e1[1:,1:] #分割出矩阵第二行，第二列以后的元素
print("矩阵的分割:\n",e2)

e3 = mat(ones((2,2)))
e4 = mat(eye(2))
e5 = vstack((e3,e4))  #按列合并,增加了行数
print("矩阵列合并:\n",e5)
e6 = hstack((e3,e4))
print("矩阵的行合并:\n",e6)

f1 = [[1],'hello',3]

f2 = array([[1,2,3],[2,3,4]])
dimension = f2.ndim
m,n = f2.shape
number = f2.size #元素总数
str = f2.dtype #元素的类型
print("矩阵的维数：",dimension)
print("矩阵的行数和列数:",m,n)
print("矩阵元素总个数:",number)
print("元素的类型:",str)

# numpy 中的矩阵也有与数组常见的属性
g1 = [[1,2],[3,2],[4,5]]  #列表
g2 = array(g1)  #将列表转化为二维数组
g3 = mat(g1) #将列表转化为矩阵
g4 = array(g3) #将矩阵转化为数组
g41 = g3.getA() #将矩阵转化为数组
g5 = g3.tolist() #将矩阵转化为列表
g6 = g2.tolist() #将数组转化为列表
print("列表：",g1)
print("数组：",g2)
print("矩阵：",g3)
print("矩阵转为数组:",g4)
print("矩阵转为数组:",g41)
print("矩阵转化为列表:",g5)
print("数组转化为列表:",g6)

#列表 数组 矩阵
#list array mat
print("列表，数组，矩阵:")
h1 =[1,2,3] #列表
h2 = array(h1) #转数组
h3 = mat(h1) #转矩阵
h4 = h2.tolist()
h5 = h3.tolist()
print("h2:",h2)
print("h3:",h3)
print("h3:",h3)
print("h4:",h4)
print("h5",h5)
print(h4 is h5[0])